#include <iostream>
#include <string>
#include <regex>

int main()
{
    // std::string str = "GET /helloworld/login?user=xiaoming&passwd=123123 HTTP/1.1";
    std::string str = "GET /helloworld/login HTTP/1.1";
    std::smatch matches;
    // std::regex e("(GET|HEAD|PUT|POST|DELETE) (/.*) HTTP/(1.[01])");
    /*
        (POST|GET)：|表示匹配任一字符串并提取出来，使用|要加()
        .点：表示匹配除\n和\r之外的任何单个字符
        *：表示匹配前面子表达式任意次，可0次
        [01]：表示匹配0或1的任一字符
    */
    std::regex e("(GET|HEAD|PUT|POST|DELETE) (/[^?]*(?://?(.*))?) HTTP/(1.[01])");
    /*
        [^?]：表示匹配非问号的单个字符
        (?:……)：表示匹配某个字符串，但是不提取，字符串内有()则表示提取
        ?：表示匹配前面的子表达式1次或0次
        因为?在正则表达式里面有特殊含义，所以需要转义为/?，但/?在字符串里有特殊含义，所以需要将/先转义，//会被转义为/，所以最后写为//?表示匹配一个?字符
    */
    bool ret = regex_match(str, matches, e);
    if (ret == false)
    {
        std::cerr << "匹配失败" << std::endl;
        return -1;
    }
    for (auto match : matches)
    {
        std::cout << match << " size: " << match.str().size() << std::endl;
    }
    return 0;
}

